#include "TaskQueue.h"
#include "task.h"
TaskQueue::TaskQueue(int queSize)
    : _queSize(queSize), _que(), _mutex(), _notFull(_mutex), _notEmpty(_mutex), _flag(true)
{
}
bool TaskQueue::empty()
{
    return 0 == _que.size();
}
bool TaskQueue::full()
{
    return _queSize == _que.size();
}
void TaskQueue::push(Task task)
{
    _mutex.lock();
    while (full())
    {
        _notFull.wait();
    }

    _que.push(task);
    _mutex.unlock();
    _notEmpty.notify();
}
Task TaskQueue::pop()
{
    Task temp;
    _mutex.lock();
    /*1.当主线程快的时候，在stop函数中会将_isExit设置为true，并且等待着子线程，然后当子线程调用
    process执行完任务再走dotask的while循环发现isExit已经被设置为true了，所以子线程就进不去了，那么
    主线程就会回收子线程，程序正常结束
    2.当子线程快的时候，将任务处理完之后已经在循环内卡在pop()那里等待主线程给新的任务，即使现在主线程
    将标志位设置为true也没有用了程序还是会卡死在那里*/
    while (_flag && empty())
    {
        _notEmpty.wait();
    }
    if (_flag)
    {
        temp = _que.front();
        _que.pop();
        _notFull.notify();
    }
    else
    {
        temp = nullptr;
    }

    _mutex.unlock();

    return temp;
}
void TaskQueue::wakeup()
{
    _flag = false;
    _notEmpty.notifyAll();
}